package cn.biplam.back.sql.type;

import java.io.Serializable;

import cn.biplam.common.wrapper.Date;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 * 日期时间数据类型
 * @author 	WangSong
 * @create 	Mar 11, 2009 5:51:44 PM
 * @version 1.0
 */
public class Datetime implements Type,Serializable{

	private static final long serialVersionUID = 6318083120153579540L;
	/** 类型关键字 */
	private static final String sTypeName="DATE";

	/** 日期类型,DATE不包含时、分、秒,DATETIME包括时、分、秒 */
	public static final int DATE=1;
	public static final int DATETIME=2;
	/** 日期格式化字符串 */
	private static String  DatetimePattern="yyyy-MM-dd HH:MM:SS";
	private static String  DatePattern="yyyy-MM-dd";

	private boolean isNull=true;

	/** 默认格式类型 */
	@SuppressWarnings("unused")
	private int iType=DATE;
	/** 默认格式字符串 */
	private String sPattern=DatePattern;
	/** 日期值 */
	private Date value=null;

	/**
	 * 默认构造函数，参数默认日期格式类型
	 */
	public Datetime(){}

	/**
	 * 构造函数，采用默认日期格式类型格式化日期值
	 * @param sDate
	 * @throws ErrorMessage
	 */
	public Datetime(String sDate) throws ErrorMessage{
		setValue(sDate);
	}

	/**
	 * 构造函数，采用指定格式类型格式日期值
	 * @param sDate
	 * @param iType
	 * @throws ErrorMessage
	 */
	public Datetime(String sDate,int iType) throws ErrorMessage{
		setPattern(iType);
		setValue(sDate);
	}

	/**
	 * @param sDate  构造函数，采用指定格式类型格式日期值
	 * @param sPattern
	 * @throws ErrorMessage
	 */
	public Datetime(String sDate,String sPattern) throws ErrorMessage{
		setPattern(sPattern);
		setValue(sDate);
	}

	/**
	 * 返回数据元描述
	 * @return
	 */
	public String getType() {
		return getTypeName();
	}

	/**
	 * 返回数据元类型关键字
	 * @return
	 */
	public String getTypeName() {
		return sTypeName;
	}

	/**
	 * 返回数据元值字符串，不允许值为空时获取
	 * @return
	 * @throws ErrorMessage
	 */
	public String getValue() throws ErrorMessage {
		if(this.value!=null){
			return value.getDateTime(sPattern);
		}else{
			ErrorMessage eMsg=new ErrorMessage("Date type is empty!");
			throw eMsg;
		}
	}

	/**
	 * 返回指定格式元数据的值
	 * @param sPattern 格式字符串
	 * @return
	 * @throws ErrorMessage
	 */
	public String getValue(String sPattern) throws ErrorMessage{
		if(this.value!=null){
			return value.getDateTime(sPattern);
		}else{
			ErrorMessage eMsg=new ErrorMessage("Date type is empty!");
			throw eMsg;
		}
	}

	/**
	 * 返回是否为空
	 * @return
	 */
	public boolean isNull() {
		return this.isNull;
	}

	public int getPercesion() {
		if(value==null){
			return 0;
		}else{
			return value.toString().length();
		}
	}

	public void setLength(int length) throws ErrorMessage {}

	/**
	 * 设置值，如果值字符串和格式化模式字符串不匹配则抛出异常
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setValue(String sValue) throws ErrorMessage {
		setValue(sValue,sPattern);
	}

	/**
	 * 设置值，如果值字符串和格式化模式字符串不匹配则抛出异常
	 * @param value
	 * @throws ErrorMessage
	 */
	public void setValue(String sValue,String sPattern) throws ErrorMessage{
		value=Date.convertStringtoDate(sPattern, sValue);
		isNull=false;
	}

	/**
	 * 返回SQL语法表示的数据内容的字符串，如果内容为空，则返回null
	 * @return
	 */
	public String toString(){
		if(!this.isNull||this.value==null){
			return "null";
		}else{
			return value.getDateTime(sPattern);
		}
	}

	/**
	 * 设置日期类型和格式化字符串
	 * @param iType 
	 * @throws ErrorMessage
	 */
	public void setPattern(int iPattern) throws ErrorMessage{
		switch(iType){
		case DATE:
			this.iType=iPattern;
			this.sPattern=DatePattern;
			break;
		case DATETIME:
			this.iType=iPattern;
			this.sPattern=DatetimePattern;
			break;
		default:
			StringBuilder sb = new StringBuilder();
		sb.append("Date Type: ");
		sb.append(iType);
		sb.append(" is an invalide type!");
		ErrorMessage eMsg =new ErrorMessage(sb.toString());
		throw eMsg;
		}
	}

	/**
	 * 根据格式字符串设置日期数据元默认的格式，如果有冒号为包含时间的日期，如果无冒号则为不包含时间的日期
	 * @param sPattern
	 * @throws ErrorMessage
	 */
	public void setPattern(String sPattern) throws ErrorMessage{

		int iPattern=0;
		if(sPattern.split(":").length>1){
			iPattern=2;
		}else{
			iPattern=1;
		}
		setPattern(iPattern);
	}

	/**
	 * 返回精度，数据元无精度，默认-1
	 * @return
	 */
	public int getScale() {
		return -1;
	}
}
